Autogenerated HTML docs for v1.4.2.3-g128e
diff --git a/howto/revert-branch-rebase.html b/howto/revert-branch-rebase.html index 6a33c6a..ae699d6 100644 --- a/howto/revert-branch-rebase.html +++ b/howto/revert-branch-rebase.html
@@ -255,17 +255,192 @@ padding-left: 0.5em; } </style> +<title>Reverting an existing commit</title> </head> <body> <div id="header"> +<h1>Reverting an existing commit</h1> </div> -<p>caret=^ -startsb=&#91; -endsb=&#93;</p> -<p></p> +<div id="preamble"> +<div class="sectionbody"> +<p>One of the changes I pulled into the <em>master</em> branch turns out to +break building GIT with GCC 2.95. While they were well intentioned +portability fixes, keeping things working with gcc-2.95 was also +important. Here is what I did to revert the change in the <em>master</em> +branch and to adjust the <em>pu</em> branch, using core GIT tools and +barebone Porcelain.</p> +<p>First, prepare a throw-away branch in case I screw things up.</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git checkout -b revert-c99 master</tt></pre> +</div></div> +<p>Now I am on the <em>revert-c99</em> branch. Let's figure out which commit to +revert. I happen to know that the top of the <em>master</em> branch is a +merge, and its second parent (i.e. foreign commit I merged from) has +the change I would want to undo. Further I happen to know that that +merge introduced 5 commits or so:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git show-branch --more=4 master master^2 | head +* [master] Merge refs/heads/portable from http://www.cs.berkeley.... + ! [master^2] Replace C99 array initializers with code. +-- +- [master] Merge refs/heads/portable from http://www.cs.berkeley.... +*+ [master^2] Replace C99 array initializers with code. +*+ [master^2~1] Replace unsetenv() and setenv() with older putenv(). +*+ [master^2~2] Include sys/time.h in daemon.c. +*+ [master^2~3] Fix ?: statements. +*+ [master^2~4] Replace zero-length array decls with []. +* [master~1] tutorial note about git branch</tt></pre> +</div></div> +<p>The <em>—more=4</em> above means "after we reach the merge base of refs, +show until we display four more common commits". That last commit +would have been where the "portable" branch was forked from the main +git.git repository, so this would show everything on both branches +since then. I just limited the output to the first handful using +<em>head</em>.</p> +<p>Now I know <em>master^2~4</em> (pronounce it as "find the second parent of +the <em>master</em>, and then go four generations back following the first +parent") is the one I would want to revert. Since I also want to say +why I am reverting it, the <em>-n</em> flag is given to <em>git revert</em>. This +prevents it from actually making a commit, and instead <em>git revert</em> +leaves the commit log message it wanted to use in <em>.msg</em> file:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git revert -n master^2~4 +$ cat .msg +Revert "Replace zero-length array decls with []." + +This reverts 6c5f9baa3bc0d63e141e0afc23110205379905a4 commit. +$ git diff HEAD ;# to make sure what we are reverting makes sense. +$ make CC=gcc-2.95 clean test ;# make sure it fixed the breakage. +$ make clean test ;# make sure it did not cause other breakage.</tt></pre> +</div></div> +<p>The reverted change makes sense (from reading the <em>diff</em> output), does +fix the problem (from <em>make CC=gcc-2.95</em> test), and does not cause new +breakage (from the last <em>make test</em>). I'm ready to commit:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git commit -a -s ;# read .msg into the log, + # and explain why I am reverting.</tt></pre> +</div></div> +<p>I could have screwed up in any of the above steps, but in the worst +case I could just have done <em>git checkout master</em> to start over. +Fortunately I did not have to; what I have in the current branch +<em>revert-c99</em> is what I want. So merge that back into <em>master</em>:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git checkout master +$ git resolve master revert-c99 fast ;# this should be a fast forward +Updating from 10d781b9caa4f71495c7b34963bef137216f86a8 to e3a693c... + cache.h | 8 ++++---- + commit.c | 2 +- + ls-files.c | 2 +- + receive-pack.c | 2 +- + server-info.c | 2 +- + 5 files changed, 8 insertions(+), 8 deletions(-)</tt></pre> +</div></div> +<p>The <em>fast</em> in the above <em>git resolve</em> is not a magic. I knew this +<em>resolve</em> would result in a fast forward merge, and if not, there is +something very wrong (so I would do <em>git reset</em> on the <em>master</em> branch +and examine the situation). When a fast forward merge is done, the +message parameter to <em>git resolve</em> is discarded, because no new commit +is created. You could have said <em>junk</em> or <em>nothing</em> there as well.</p> +<p>There is no need to redo the test at this point. We fast forwarded +and we know <em>master</em> matches <em>revert-c99</em> exactly. In fact:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git diff master..revert-c99</tt></pre> +</div></div> +<p>says nothing.</p> +<p>Then we rebase the <em>pu</em> branch as usual.</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git checkout pu +$ git tag pu-anchor pu +$ git rebase master +* Applying: Redo "revert" using three-way merge machinery. +First trying simple merge strategy to cherry-pick. +Finished one cherry-pick. +* Applying: Remove git-apply-patch-script. +First trying simple merge strategy to cherry-pick. +Simple cherry-pick fails; trying Automatic cherry-pick. +Removing Documentation/git-apply-patch-script.txt +Removing git-apply-patch-script +Finished one cherry-pick. +* Applying: Document "git cherry-pick" and "git revert" +First trying simple merge strategy to cherry-pick. +Finished one cherry-pick. +* Applying: mailinfo and applymbox updates +First trying simple merge strategy to cherry-pick. +Finished one cherry-pick. +* Applying: Show commits in topo order and name all commits. +First trying simple merge strategy to cherry-pick. +Finished one cherry-pick. +* Applying: More documentation updates. +First trying simple merge strategy to cherry-pick. +Finished one cherry-pick.</tt></pre> +</div></div> +<p>The temporary tag <em>pu-anchor</em> is me just being careful, in case <em>git +rebase</em> screws up. After this, I can do these for sanity check:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git diff pu-anchor..pu ;# make sure we got the master fix. +$ make CC=gcc-2.95 clean test ;# make sure it fixed the breakage. +$ make clean test ;# make sure it did not cause other breakage.</tt></pre> +</div></div> +<p>Everything is in the good order. I do not need the temporary branch +nor tag anymore, so remove them:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ rm -f .git/refs/tags/pu-anchor +$ git branch -d revert-c99</tt></pre> +</div></div> +<p>It was an emergency fix, so we might as well merge it into the +<em>release candidate</em> branch, although I expect the next release would +be some days off:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git checkout rc +$ git pull . master +Packing 0 objects +Unpacking 0 objects + +* committish: e3a693c... refs/heads/master from . +Trying to merge e3a693c... into 8c1f5f0... using 10d781b... +Committed merge 7fb9b7262a1d1e0a47bbfdcbbcf50ce0635d3f8f + cache.h | 8 ++++---- + commit.c | 2 +- + ls-files.c | 2 +- + receive-pack.c | 2 +- + server-info.c | 2 +- + 5 files changed, 8 insertions(+), 8 deletions(-)</tt></pre> +</div></div> +<p>And the final repository status looks like this:</p> +<div class="listingblock"> +<div class="content"> +<pre><tt>$ git show-branch --more=1 master pu rc +! [master] Revert "Replace zero-length array decls with []." + ! [pu] git-repack: Add option to repack all objects. + * [rc] Merge refs/heads/master from . +--- + + [pu] git-repack: Add option to repack all objects. + + [pu~1] More documentation updates. + + [pu~2] Show commits in topo order and name all commits. + + [pu~3] mailinfo and applymbox updates + + [pu~4] Document "git cherry-pick" and "git revert" + + [pu~5] Remove git-apply-patch-script. + + [pu~6] Redo "revert" using three-way merge machinery. + - [rc] Merge refs/heads/master from . +++* [master] Revert "Replace zero-length array decls with []." + - [rc~1] Merge refs/heads/master from . +... [master~1] Merge refs/heads/portable from http://www.cs.berkeley....</tt></pre> +</div></div> +</div> +</div> <div id="footer"> <div id="footer-text"> -Last updated 15-Jul-2006 01:38:33 UTC +Last updated 03-Oct-2006 08:41:50 UTC </div> </div> </body>